/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modele.realisateur;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import modele.De;
import modele.ModeleYams;
import modele.ModeleYamsInterface;
import modele.combinaison.Suite;

/**
 * Classe RealisateurSuite : Realise les combinaisons suitées.
 * Le principe est le meme pour toutes les suites, seul la taille
 * de la suite varie.
 * @author Florian MININ & Khémon BEH
 */
public class RealisateurSuite extends RealisateurCombinaisonComplexe{
    /**
     * Attributs
     */
    private De[] valeurs;
    Suite combinaison;

    /**
     * Constructeur
     * @param combinaison
     * @param modele
     */
    public RealisateurSuite(Suite combinaison, ModeleYamsInterface modele){
        super(modele);
        this.combinaison = combinaison;
        valeurs = new De[5];
    }

    /**
     * Réalise la combinaison
     */
    @Override
    public void realiseCombinaison() {
        int valPrec,valActu,debutSerie,
                debutPlusLongueSerie,nbValeursSuccessives,plusLongueSuite;
        List<De> deASelectionner = new ArrayList<De>();
        //Tant qu'on n'a pas effectué tout les lancers.
        while (modele.getNbLanceDesRestant() > 0) {
            //On (ré)initialise les valeurs
            valPrec = 0;
            valActu = 0;
            debutSerie = 0;
            debutPlusLongueSerie = 0;
            nbValeursSuccessives = 0;
            plusLongueSuite = 0;

            //On jette les des
            modele.jetteDes();
            List<De> ensembleDes = modele.getDes();
            int indice = 0;
            //1er parcours : On récupère toutes les valeurs
            for (De d : ensembleDes) {
                modele.deSelectionneDe(d);
                valeurs[indice] = d;
                indice++;
            }

            //On trie le tableau
            Arrays.sort(valeurs);

            //On parcourt le tableau et on compte les valeurs successives
            for (int i = 0; i < 5; i++) {
                valActu = valeurs[i].getValeur();
                if (i == 0) {
                    nbValeursSuccessives++;
                    plusLongueSuite++;
                    debutSerie = valActu;
                    valPrec = valActu;
                    deASelectionner.add(valeurs[i]);
                } else {
                    if (valActu == valPrec + 1) {
                        nbValeursSuccessives++;
                        valPrec = valActu;
                        deASelectionner.add(valeurs[i]);
                        //On compare la taille de la suite par rapport a la
                        //longueur de la suite a effectuer.
                        if (nbValeursSuccessives == combinaison.getLongueurSuite()) {
                            plusLongueSuite = combinaison.getLongueurSuite();
                            break;
                        }
                        //Si on est au dernier tour
                        if (i == 4) {
                            if (nbValeursSuccessives > plusLongueSuite) {
                                plusLongueSuite = nbValeursSuccessives;
                                debutPlusLongueSerie = debutSerie;
                            }
                        }
                    } //On ne coupe pas la série car les valeurs sont égales
                    else if (valActu != valPrec || i == 4) {
                        if (nbValeursSuccessives > plusLongueSuite) {
                            plusLongueSuite = nbValeursSuccessives;
                            debutPlusLongueSerie = debutSerie;
                        }
                        //Si on n'est pas au dernier dé.
                        if (i != 4) {
                            nbValeursSuccessives = 1;
                            debutSerie = valActu;
                            valPrec = valActu;
                            deASelectionner.clear();
                            deASelectionner.add(valeurs[i]);
                        }
                    }
                }
            }

            //Si on a au moins deux dés qui se suivent
            if (plusLongueSuite > 1) {
                //Selectionne les des ajoutés a la liste des
                //dés a selectionner
                for (De de:deASelectionner) {
                    modele.selectionneDe(de);
                }
            }

            //Si la plus longue suite de dés correspond a la longueur
            //de la suite a réaliser
            if (plusLongueSuite == combinaison.getLongueurSuite()) {
                break;
            }
        }
    }

}
